package controllers;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;


import models.*;
import play.*;
import play.mvc.*;
import play.mvc.Scope.Session;

@With(Secure.class)
public class FMPAs extends Controller{

	/**
	 * Instancie des variables de session(session.put())
	 * Met ces variables dans des variables de rendu(render.args())
	 */
	@Before
	static void setConnectedUser() {
		if(Security.isConnected()) {
			if(!session.contains("agent_fullname")){
				Agent agent = Agent.find("nomUtilisateur", Security.connected()).first();
				Fonction gestFonct=Fonction.find("id_fonction like ?", "FONCT").first();
				Fonction gestTer=Fonction.find("id_fonction like ?", "TERRI").first();
				Fonction admin=Fonction.find("id_fonction like ?", "ADM").first();
				Fonction chef_CIS=Fonction.find("id_fonction like ?", "RCIS").first();
				Fonction formateur=Fonction.find("id_fonction like ?", "FOR").first();
				List<CIS> centres=CIS.find("responsable.id like ?", agent.id).fetch();
				boolean resp=!centres.isEmpty();
				/*
				 * Compte le nombre d'autorisation en attente pour les CIS où l'agent est responsable
				 * et l'ajoute à une variable de session et de rendu.
				 */
				List<Candidat> listeCandidats=new ArrayList<Candidat>();
				if(agent.fonction.contains(chef_CIS) || resp){
					Iterator<CIS> i=centres.iterator();
					while(i.hasNext()){
						List<Candidat> cand=Candidat.find("agent.cis.id like ? and etatCandid.id_etatcandid like ?", i.next().id, "AAUT").fetch();
						listeCandidats.addAll(cand);
					}
					session.put("nb_demande_auto", listeCandidats.size());
					renderArgs.put("nb_demande_auto", Integer.parseInt(session.get("nb_demande_auto")));
				}
				/*
				 * Compte le nombre de validations et d'annulations en attente et l'ajoute à une variable de session et de rendu.
				 */
				if(agent.fonction.contains(admin) || agent.fonction.contains(gestFonct)){
					long nbValidAdmin=Candidat.count("etatCandid.id_etatcandid like ? and demandeAnnulation is not true", "AVAL");
					long nbAnnulAdmin=Candidat.count("demandeAnnulation is true");
					session.put("nb_demande_valid_admin", nbValidAdmin);
					renderArgs.put("nb_demande_valid_admin", Integer.parseInt(session.get("nb_demande_valid_admin")));
					session.put("nb_demande_annul_admin", nbAnnulAdmin);
					renderArgs.put("nb_demande_annul_admin", Integer.parseInt(session.get("nb_demande_annul_admin")));
				}
				/*
				 * Compte le nombre de validations et d'annulations en attente pour le groupement dont l'agent est responsable
				 * et l'ajoute à une variable de session et de rendu.
				 */
				if(agent.fonction.contains(gestTer)){
					long nbValidTerri=Candidat.count("etatCandid.id_etatcandid like ? and stage.structure.responsable like ? and demandeAnnulation is not true", "AVAL", agent);
					long nbAnnulTerri=Candidat.count("demandeAnnulation is true and stage.structure.responsable.id like ? and etatCandid.id_etatcandid not like ? or etatCandid.nom not like ?", agent.id, "ANN", "REF");
					session.put("nb_demande_valid_terri", nbValidTerri);
					renderArgs.put("nb_demande_valid_terri", Integer.parseInt(session.get("nb_demande_valid_terri")));
					session.put("nb_demande_annul_terri", nbAnnulTerri);
					renderArgs.put("nb_demande_annul_terri", Integer.parseInt(session.get("nb_demande_annul_terri")));
				}
				
				/*
				 * Création des variables de session
				 */
				
				/*
				 * groupementResp_id représente l'id du groupement de l'agent si celui-ci est le responsable
				 * Sinon l'id du groupement auquel il appartient s'il possède la fonction gestionnaireTerritorial
				 */
				Groupement gpmt=Groupement.find("responsable like ?", agent).first();
				if(gpmt!=null){
					session.put("groupementResp_id", gpmt.id);
				}
				else if(agent.fonction.contains(gestTer)){
					session.put("groupementResp_id", agent.cis.groupement.id);
				}
				
				int aujourdhui=Calendar.getInstance().get(Calendar.YEAR);
				session.put("nomUtilisateur", agent.nomUtilisateur);
				session.put("anneeEnCours", aujourdhui);
				session.put("agent_id", agent.id);
				session.put("agent_niv", agent.niv.niv);
				session.put("agent_cis", agent.cis);
				session.put("agent_grpt", agent.cis.groupement);
				session.put("chef_CIS", agent.fonction.contains(chef_CIS));
				session.put("agent_email", agent.email);
				session.put("agent_fullname", agent.fullname());
				session.put("agent_responsable", resp);
				session.put("agent_grade", agent.grade.toString());
				session.put("gestionnaireFonct", (agent.fonction.contains(gestFonct)));
				session.put("gestionnaireTerri", agent.fonction.contains(gestTer));
				session.put("formateur", agent.fonction.contains(formateur));
				session.put("admin", agent.fonction.contains(admin));
				session.put("CISService", agent.cis.nom);
				/*
				 * Compte le nombre de validations en attente pour les fmpa et l'ajoute à une variable de session et de rendu.
				 */
				if(agent.fonction.contains(admin) || agent.fonction.contains(gestFonct)){
					long nbValidAdmin=FMPA.count("etat.id_etatfmpa like ?", "ATVAL");
					session.put("nb_valid_fmpa", nbValidAdmin);
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}else if(agent.fonction.contains(gestTer)){
					long nbValidTerri=FMPA.count("etat.id_etatfmpa like ? and cis.groupement.nom like ?", "ATVAL", session.get("agent_grpt"));
					session.put("nb_valid_fmpa", nbValidTerri);
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}else if(agent.fonction.contains(chef_CIS) || resp){
					long nbValidCis=FMPA.count("etat.id_etatfmpa like ? and cis.nom like ?", "ATVAL", session.get("CISService"));
					session.put("nb_valid_fmpa", nbValidCis);
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}
				System.out.println(session.get("nb_valid_fmpa"));
				/*
				 * Création des variables de rendu
				 */
				if(session.contains("groupementResp_id")){
					renderArgs.put("groupementResp_id", Long.parseLong(session.get("groupementResp_id")));
				}
				renderArgs.put("anneeEnCours", Integer.parseInt(session.get("anneeEnCours")));
				renderArgs.put("CISService", session.get("CISService"));
				renderArgs.put("agent_niv", Integer.parseInt(session.get("agent_niv")));
				renderArgs.put("agent_grpt", session.get("agent_grpt"));
				renderArgs.put("chef_CIS", session.get("chef_CIS").equals("true"));
				renderArgs.put("admin", session.get("admin").equals("true"));
				renderArgs.put("formateur", session.get("formateur").equals("true"));
				renderArgs.put("agent_email", session.get("agent_email"));
				renderArgs.put("agent_fullname", session.get("agent_fullname"));
				renderArgs.put("agent_responsable", session.get("agent_responsable").equals("true"));
				renderArgs.put("agent_grade", session.get("agent_grade"));
				renderArgs.put("gestionnaireFonct", session.get("gestionnaireFonct").equals("true"));
				renderArgs.put("gestionnaireTerri", session.get("gestionnaireTerri").equals("true"));
				if(agent.niv.id != 0){
					session.put("agent_for", agent.niv);
					renderArgs.put("agent_for", session.get("agent_for"));
				}
				Calendar c=Calendar.getInstance();
				renderArgs.put("Annee", c.get(Calendar.YEAR));
			}
			else{
				/*
				 * Création des variables de rendu si les variables de session existent
				 */
				if(session.contains("nb_demande_valid_terri") || session.contains("nb_demande_annul_terri")){
					renderArgs.put("nb_demande_valid_terri", Integer.parseInt(session.get("nb_demande_valid_terri")));
					renderArgs.put("nb_demande_annul_terri", Integer.parseInt(session.get("nb_demande_annul_terri")));
				}
				if(session.contains("nb_demande_auto")){
					renderArgs.put("nb_demande_auto", Integer.parseInt(session.get("nb_demande_auto")));
				}
				if(session.contains("nb_demande_valid_admin") || session.contains("nb_demande_annul_admin")){
					renderArgs.put("nb_demande_valid_admin", Integer.parseInt(session.get("nb_demande_valid_admin")));
					renderArgs.put("nb_demande_annul_admin", Integer.parseInt(session.get("nb_demande_annul_admin")));
				}
				if(session.contains("nb_demande_auto")){
					renderArgs.put("nb_demande_auto", Integer.parseInt(session.get("nb_demande_auto")));
				}
				renderArgs.put("anneeEnCours", Integer.parseInt(session.get("anneeEnCours")));
				renderArgs.put("CISService", session.get("CISService"));
				renderArgs.put("agent_niv", Integer.parseInt(session.get("agent_niv")));
				renderArgs.put("agent_grpt", session.get("agent_grpt"));
				renderArgs.put("chef_CIS", session.get("chef_CIS").equals("true"));
				renderArgs.put("admin", session.get("admin").equals("true"));
				renderArgs.put("formateur", session.get("formateur").equals("true"));
				renderArgs.put("agent_email", session.get("agent_email"));
				renderArgs.put("agent_fullname", session.get("agent_fullname"));
				renderArgs.put("agent_responsable", session.get("agent_responsable").equals("true"));
				renderArgs.put("agent_grade", session.get("agent_grade"));
				renderArgs.put("gestionnaireFonct", session.get("gestionnaireFonct").equals("true"));
				renderArgs.put("gestionnaireTerri", session.get("gestionnaireTerri").equals("true"));
				renderArgs.put("agent_for", session.get("agent_for"));
				if(session.contains("nb_valid_fmpa")){
					renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
				}
				if(session.contains("groupementResp_id")){
					renderArgs.put("groupementResp_id", Long.parseLong(session.get("groupementResp_id")));
				}
				Calendar c=Calendar.getInstance();
				renderArgs.put("Annee", c.get(Calendar.YEAR));
			}
		}
	}

	/**
	 * Fonction appelée pour récupérer les informations nécessaires à la liste des fmpas.
	 * Appelle le fichier html éponyme
	 */
	public static void listFMPA(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		List<FMPA> fmpas=new ArrayList<FMPA>();
		Date aujourdhui = new Date();
		CIS cis=CIS.find("nom like ?", session.get("CISService")).first();
		boolean isFMPA=false;
		//récupération des états
		EtatFMPA prevu=EtatFMPA.find("id_etatfmpa like ?", "PREVU").first();
		EtatFMPA invalide=EtatFMPA.find("id_etatfmpa like ?", "INVAL").first();
		//récupération des FMPA prévues ou invalides en fonction de la fonction
		if(session.get("gestionnaireFonct").equals("true") || session.get("admin").equals("true")){
			fmpas=FMPA.find("(etat like ? or etat like ?)", prevu,invalide ).fetch();
		}
		else{
			if(session.get("gestionnaireTerri").equals("true")){
				fmpas=FMPA.find("(etat like ? or etat like ?) and cis.groupement like ?", prevu, invalide,cis.groupement ).fetch();
			}else if(session.get("agent_responsable").equals("true")){
				//pour les chefs de CIS, on récupère les cis dont il est responsable
				//puis on récupère les FMPA prévues ou invalides de ces cis
				List<CIS> listCis=CIS.find("responsable.id like ?", Long.decode(session.get("agent_id"))).fetch();
				CIS c;
				if(!listCis.contains(cis)){
					listCis.add(cis);
				}
				Iterator<CIS> itCis=listCis.iterator();
				List<FMPA> listFmpa;

				while(itCis.hasNext()){
					c=itCis.next();
					listFmpa=FMPA.find("(etat like ? or etat like ?) and cis like ?", prevu,invalide,c).fetch();
					fmpas.addAll(listFmpa);
				}
			}
			List<FMPA> fmpabis=FMPA.find("(etat like ? or etat like ?) and cis like ?", prevu,invalide,cis ).fetch();
			Iterator<FMPA> itf=fmpabis.iterator();
			FMPA f;
			while(itf.hasNext()){
				f=itf.next();
				if(!fmpas.contains(f)){
					fmpas.add(f);
				}
			}
			//récupération des participation où l'agent est formateur pour afficher les fmpas correspondantes
			//les rajoute à la liste des fmpa
			List<Participation> participations=Participation.find("agent.id like ? and role.id_rolefmpa like ? and fmpa.cis not like ?", Long.decode(session.get("agent_id")), "FORMA", cis).fetch();
			Iterator<Participation> itPart=participations.iterator();
			Participation part;
			while(itPart.hasNext()){
				part=itPart.next();
				f=part.fmpa;
				if((f.etat.equals(prevu)||f.etat.equals(invalide))&&!fmpas.contains(f)){
					fmpas.add(f);
				}
			}
		}
		isFMPA=(fmpas.size()!=0);
		render(fmpas, aujourdhui, isFMPA);
	}

	/**
	 * Fonction appelée pour récupérer les informations nécessaires à la création d'une nouvelle fmpa.
	 * Appelle le fichier html éponyme qui permet de créer une fmpa.
	 */
	public static void newFMPAForm(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		List<CIS> centres;
		List<Thematique> thematiques;
		List<Duree> durees;
		CIS cis=CIS.find("nom like ?", session.get("CISService")).first();

		//récupération de la liste des CIS ou service, des thématiques, des durées
		centres=CIS.find("order by nom").fetch();
		thematiques=Thematique.find("id_thematique not like ? order by nom", "SAPQ").fetch();
		durees=Duree.findAll();
		long idCis=cis.id;
		render(centres, thematiques,durees, idCis);
	}

	/**
	 * Crée la fmpa avec les informations du formulaire. Vérifie que les informations obligatoires ont été renseignées et sauvegarde la fmpa.
	 * @param cis : id du cis
	 * @param date
	 * @param thematique : id de la thématique
	 * @param Theme
	 * @param description
	 * @param duree : id de la durée
	 * @param observation
	 */
	public static void newFMPASave(long cis, Date date, long thematique, String Theme, String description, long duree, String observation){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		EtatFMPA etat=EtatFMPA.find("id_etatfmpa like ?", "PREVU").first();

		//récupération de la liste des CIS ou service, des thématiques, des durées
		//pour le retour sur le formulaire en cas d'erreur
		List<CIS> centres=CIS.find("order by nom").fetch();
		List<Thematique> thematiques=Thematique.find("nom not like ? order by nom", "SAP_Quinquennal").fetch();
		List<Duree> durees=Duree.findAll();
		long idCis=cis;

		//récupération des objets par les id
		Duree dureeObj=Duree.findById(duree);
		CIS cisObj=CIS.findById(cis);
		Thematique thematiqueObj=Thematique.findById(thematique);
		Agent a=Agent.findById(Long.decode(session.get("agent_id")));
		RoleFMPA role=RoleFMPA.find("id_rolefmpa like ?", "FORMA").first();

		//création de l'objet FMPA
		FMPA fmpa;
		fmpa=new FMPA(cisObj,date,thematiqueObj,Theme,description,dureeObj,observation,etat);
		Participation p=new Participation(a,fmpa,role);
		fmpa.addParticipant(p);

		//vérifie que tous les champs requis sont bien renseignés et sauvegarde en cas de vérification réussie
		//Affichage d'un bandeau en fonction du résultat
		validation.valid(fmpa);
		if(validation.hasErrors()){
			play.data.validation.Error error=validation.required(dureeObj).error;
			if(error!=null){
				flash.error(error.message("durée"));
			}
			error=validation.required(thematiqueObj).error;
			if(error!=null){
				flash.error(error.message("thématique"));
			}
			error=validation.required(date).error;
			if(error!=null){
				flash.error(error.message("date"));
			}
			render("@newFMPAForm", fmpa, centres, thematiques, durees, idCis);
		}else{
			try {
				fmpa.save();
			} catch (Exception e) {
				flash.error("Thème ou observation trop long.");
				render("@newFMPAForm", fmpa, centres, thematiques, durees, idCis);
			}
			flash.success("La FMPA a bien été enregistré.");
			newFMPAForm();}
	}

	/**
	 * Fonction appelée pour récupérer les fmpas en attente de validation
	 * Appelle le fichier html éponyme
	 */
	public static void listValidation(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		List<FMPA> fmpas=new ArrayList<FMPA>();
		EtatFMPA etat=EtatFMPA.find("id_etatfmpa like ?", "ATVAL").first();
		CIS cis=CIS.find(" nom like ?", session.get("CISService")).first();

		//récupère la liste des FMPA en attente de validation en fonction des droits
		//sur tout le territoire pour les gestionnaires fonctionnels ou les administrateurs
		if(session.get("gestionnaireFonct").equals("true") || session.get("admin").equals("true")){
			fmpas=FMPA.find("etat like ?", etat).fetch();
		}
		//dans son groupement pour le gestionnaire territorial
		else if(session.get("gestionnaireTerri").equals("true")){
			fmpas=FMPA.find("etat like ? and cis.groupement like ?", etat, cis.groupement ).fetch();
		}
		//dans les cis sous sa responsabilité pour le chef de centre
		else if(session.get("agent_responsable").equals("true")){
			List<CIS> listCis=CIS.find("responsable.id like ?", Long.decode(session.get("agent_id"))).fetch();
			Iterator<CIS> itCis=listCis.iterator();
			CIS c;
			List<FMPA> listFmpa;
			while(itCis.hasNext()){
				c=itCis.next();
				listFmpa=FMPA.find("etat like ? and cis like ?", etat,c).fetch();
				fmpas.addAll(listFmpa);
			}
		}
		//dans son cis pour les agents avec les droits de chef de centre
		if(session.get("chef_CIS").equals("true")){
			List<FMPA> fmpabis=FMPA.find("etat like ? and cis like ?", etat, cis).fetch();
			Iterator<FMPA> itf=fmpabis.iterator();
			FMPA f;
			while(itf.hasNext()){
				f=itf.next();
				if(!fmpas.contains(f)){
					fmpas.add(f);
				}
			}
		}
		boolean isFMPA=(fmpas.size()!=0);

		render(fmpas, isFMPA);
	}

	/**
	 * permet de récupérer les informations de la fmpa ainsi que les listes nécessaires à l'ajout des agents
	 * Appelle le fichier html éponyme qui permet de visualiser les détails de la fmpa et de gérer la liste des participants
	 * @param id : id de la fmpa
	 */
	public static void detailFMPA(long id){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération de la fmpa, des listes des participants, des cis, des agents du cis et des rôles
		FMPA fmpa=FMPA.findById(id);
		//si la fmpa est une SAP quinquennale, on la récupère et on renvoie vers la page correspondante
		if(fmpa.thematique.nom.equals("SAP_Quinquennal")){
			FMPAQuinquennal q=FMPAQuinquennal.find("fmpa like ?", fmpa).first();
			FMPAQuinquennals.detailFMPA(q.id);
		}
		List<Participation> participants=Participation.find("fmpa_id like ?", id).fetch();
		List<CIS> ciss=CIS.find("order by nom").fetch();
		List<Agent> agents=Agent.find("cis like ? order by nom", fmpa.cis).fetch();
		List<RoleFMPA> roles=RoleFMPA.findAll();
		//le boolean permet de savoir si il y a une liste à afficher
		//les id permettent d'afficher directement le cis de l'agent et le role de formé dans les select
		boolean isParticipant=(participants.size()!=0);
		long idCis=fmpa.cis.id;
		RoleFMPA r=RoleFMPA.find("id_rolefmpa like ?", "FORME").first();
		long idForme=r.id;
		renderArgs.put("isParticipant", isParticipant);
		render(fmpa,participants,ciss,agents,roles,idCis,idForme);
	}

	/**
	 * Récupère la liste des agents du cis
	 * @param cis : id du cis
	 */
	public static void listAgent(CIS cis){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupère la liste des agents du cis
		List<Agent> agents=Agent.find("cis like ? order by nom", cis).fetch();
		render(agents);
	}

	/**
	 * Récupère les informations du formulaire, crée une nouvelle participation, vérifie que toutes les informations ont été renseignées et sauvegarde l'objet
	 * @param agent : id de l'agent
	 * @param role : id du role
	 * @param fmpa : id de la fmpa
	 */
	public static void newParticipantSave(long agent, long role, long fmpa){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupère l'agent, le rôle et la fmpa avec les identifiants
		Agent agentObj=Agent.findById(agent);
		FMPA fmpaObj=FMPA.findById(fmpa);
		RoleFMPA roleObj=RoleFMPA.findById(role);
		//vérifie que l'agent n'a pas déjà été ajouté à la fmpa
		//on peut ajouter un agent avec deux roles différents
		Participation test=Participation.find("fmpa like ? and agent like ? and role like ?", fmpaObj, agentObj, roleObj).first();
		if(test!=null){
			flash.error("cet agent fait déjà parti de la liste");
			detailFMPA(fmpa);
		}else{
			//création de l'objet participation
			Participation p=new Participation(agentObj,fmpaObj,roleObj);
			//ajout à la liste des participations de la fmpa
			fmpaObj.participants.add(p);
			//test de validité de la participation
			//affichage d'un bandeau en fonction de la validité et retour à la page de détail de la fmpa
			validation.valid(p);
			if(validation.hasErrors()){
				flash.error("aucun agent n'a été sélectionné");
				detailFMPA(fmpa);
			}else{
				p.save();
				fmpaObj.save();
				flash.success("un nouveau participant a été ajouté.");
				detailFMPA(fmpa);
			}
		}
	}

	/**
	 * valide ou non la participation
	 * @param participation : id de la participation
	 * @param valide true si fmpa validée
	 * @param fmpa : id de la fmpa
	 */
	public static void valider(long participation,boolean valide,long fmpa){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération de l'objet participation
		//validation de la participation et sauvegarde de l'objet dans la BDD
		Participation p=Participation.findById(participation);
		p.valide=valide;
		p.save();
		detailFMPA(fmpa);
	}

	/**
	 * permet de valider toutes les participations d'une fmpa
	 * @param fmpa : id de la fmpa
	 */
	public static void validerTous(long fmpa){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération des participations de la fmpa
		//validation de chaque participation et sauvegarde de l'objet dans la BDD
		List<Participation> listP=Participation.find("fmpa.id like ?", fmpa).fetch();
		Iterator<Participation> itPart=listP.iterator();
		Participation p;
		while(itPart.hasNext()){
			p=itPart.next();
			p.valide=true;
			p.save();
		}
		detailFMPA(fmpa);
	}

	/**
	 * Récupère les informations de la fmpa et les listes nécessaires.
	 * Appelle le fichier html éponyme qui permet de modifier une fmpa.
	 * @param id : id de la fmpa
	 */
	public static void modifFMPAForm(long id){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		else{
			List<CIS> centres;
			List<Thematique> thematiques;
			List<Duree> durees;

			//récupération de la liste des CIS ou service, des thématiques, des durées
			FMPA fmpa=FMPA.findById(id);
			centres=CIS.find("order by nom").fetch();
			thematiques=Thematique.find("nom not like ? order by nom", "SAP_Quinquennal").fetch();
			durees=Duree.findAll();
			//formatage de la date pour affichage
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			String date=sdf.format(fmpa.date);
			//récupération des id pour afficher les bonnes valeurs dans les select
			long idCis=fmpa.cis.id;
			long idThema=fmpa.thematique.id;
			long idDuree=fmpa.duree.id;
			List<SousThematique> sousThematiques=SousThematique.find("thematique like ?", fmpa.thematique).fetch();
			render(fmpa, centres, thematiques, durees, date, idCis, idThema, idDuree, sousThematiques);
		}
	}

	/**
	 * récupère les informations du formulaire, les compare avec les informations de la fmpa originale et sauvegarde les nouvelles informations.
	 * @param cis : id du cis
	 * @param date
	 * @param thematique : id de la thématique
	 * @param Theme
	 * @param description
	 * @param duree : id de la durée
	 * @param observation
	 * @param fmpa : id de la fmpa
	 */
	public static void modifFMPA( long cis, Date date, long thematique,String Theme, String description, long duree, String observation, long fmpa){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		FMPA fmpaObj=FMPA.findById(fmpa);
		//pour chaque argument on vérifie si il y a eu modification
		//en cas de modification on modifie l'ancienne valeur
		if(!fmpaObj.cis.id.equals(cis)){fmpaObj.cis=CIS.findById(cis);}
		if(!fmpaObj.date.equals(date)){fmpaObj.date=date;}
		if(!fmpaObj.thematique.id.equals(thematique)){fmpaObj.thematique=Thematique.findById(thematique);}
		if(!fmpaObj.sousThematique.equals(Theme)){fmpaObj.sousThematique=Theme;}
		if(!fmpaObj.description.equals(description)){fmpaObj.description=description;}
		if(!fmpaObj.duree.id.equals(duree)){fmpaObj.duree=Duree.findById(duree);}
		if(!fmpaObj.observation.equals(observation)){fmpaObj.observation=observation;}
		//test de validité de la fmpa
		//en cas de validité, sauvegarde de l'objet et retour aux détails de la fmpa
		validation.valid(fmpaObj);
		if(validation.hasErrors()){
			flash.error("Il y a une erreur dans le formulaire");
			modifFMPAForm(fmpa);
		}else{
			try {
				fmpaObj.save();
			} catch (Exception e) {
				flash.error("Thème ou observation trop long");
				modifFMPAForm(fmpa);
			}
			flash.success("Les modifications ont été enregistrées.");
			detailFMPA(fmpa);
		}
	}

	/**
	 * retire la participation de la fmpa
	 * @param participation : id de la participation
	 * @param fmpa : id de la fmpa
	 */
	public static void retirerParticipant(long participation, long fmpa){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération des objets par les id
		Participation p=Participation.findById(participation);
		FMPA fmpaObj=FMPA.findById(fmpa);
		//la participation est supprimée de la fmpa et de la table Participation
		fmpaObj.participants.remove(p);
		fmpaObj.save();
		p._delete();
		detailFMPA(fmpa);
	}

	/**
	 * passe la fmpa en état d'attente de validation
	 * @param id : id de la fmpa
	 */
	public static void demandeValid(long id){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}

		//changement de l'état de la fmpa en état "Attente de validation"
		FMPA fmpa=FMPA.findById(id);
		fmpa.etat=EtatFMPA.find("id_etatfmpa like ?", "ATVAL").first();

		fmpa.save();

		/*
		 * Compte le nombre de validations en attente pour les fmpa et l'ajoute à une variable de session et de rendu.
		 */
		if(session.get("gestionnaireFonct").equals("true")||session.get("admin").equals("true")){
			long nbValidAdmin=FMPA.count("etat.id_etatfmpa like ?", "ATVAL");
			session.put("nb_valid_fmpa", nbValidAdmin);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}else if(session.get("gestionnaireTerri").equals("true")){
			long nbValidTerri=FMPA.count("etat.id_etatfmpa like ? and cis.groupement.nom like ?", "ATVAL", session.get("agent_grpt"));
			session.put("nb_valid_fmpa", nbValidTerri);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}else if(session.get("agent_responsable").equals("true")||session.get("chef_CIS").equals("true")){
			long nbValidCis=FMPA.count("etat.id_etatfmpa like ? and cis.nom like ?", "ATVAL", session.get("CISService"));
			session.put("nb_valid_fmpa", nbValidCis);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}

		flash.success("demande de validation transmise au chef de centre.");
		listFMPA();
	}

	/**
	 * si valid est vrai, passe la fmpa dans l'état Terminee, sinon dans l'état Invalide
	 * @param valid true si la fmpa est validée
	 * @param id : id de la fmpa
	 */
	public static void validerFMPA(boolean valid, long id){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		FMPA fmpa=FMPA.findById(id);
		EtatFMPA etat;
		//si le paramètre valid est vrai, passage en état "Terminee"
		if(valid){
			etat=EtatFMPA.find("id_etatfmpa like ?", "TERMI").first();
			fmpa.etat=etat;
		}
		//sinon passage à l'état "Invalide"
		else{
			etat=EtatFMPA.find("id_etatfmpa like ?", "INVAL").first();
			fmpa.etat=etat;
		}
		fmpa.save();
		flash.success("la modification a bien été prise en compte");
		/*
		 * Compte le nombre de validations en attente pour les fmpa et l'ajoute à une variable de session et de rendu.
		 */
		if(session.get("gestionnaireFonct").equals("true")||session.get("admin").equals("true")){
			long nbValidAdmin=FMPA.count("etat.id_etatfmpa like ?", "ATVAL");
			session.put("nb_valid_fmpa", nbValidAdmin);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}else if(session.get("gestionnaireTerri").equals("true")){
			long nbValidTerri=FMPA.count("etat.id_etatfmpa like ? and cis.groupement.nom like ?", "ATVAL", session.get("agent_grpt"));
			session.put("nb_valid_fmpa", nbValidTerri);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}else if(session.get("agent_responsable").equals("true")||session.get("chef_CIS").equals("true")){
			long nbValidCis=FMPA.count("etat.id_etatfmpa like ? and cis.nom like ?", "ATVAL", session.get("CISService"));
			session.put("nb_valid_fmpa", nbValidCis);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}
		listValidation();
	}

	/**
	 * permet de valider ou d'invalider les fmpas selon les cases cochées dans le formulaire
	 */
	public static void validationMasse(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		EtatFMPA etat=EtatFMPA.find("id_etatfmpa like ?", "ATVAL").first();
		List<FMPA> FMPAs=new ArrayList<FMPA>();
		//récupération de la liste des fmpa du cis en attente de validation
		if(session.get("admin").equals("true")){
			FMPAs=FMPA.find("etat like ?", etat).fetch();
		}else if(session.get("agent_responsable").equals("true")){
			//récupère les cis sous al responsabilité de l'agent
			//récupère les fmpas en attente de validation de ces centres
			List<CIS> listCis=CIS.find("responsable.id like ?", Long.decode(session.get("agent_id"))).fetch();
			Iterator<CIS> itCis=listCis.iterator();
			CIS c;
			List<FMPA> listFmpa;
			while(itCis.hasNext()){
				c=itCis.next();
				listFmpa=FMPA.find("etat like ? and cis like ?", etat,c).fetch();
				FMPAs.addAll(listFmpa);
			}
		}
		if(session.get("chef_CIS").equals("true")){
			//récupération de la liste des fmpa du cis en attente de validation
			CIS cis=CIS.find(" nom like ?", session.get("CISService")).first();
			List<FMPA> fmpabis=FMPA.find("etat like ? and cis like ?", etat, cis).fetch();
			Iterator<FMPA> itf=fmpabis.iterator();
			FMPA f;
			while(itf.hasNext()){
				f=itf.next();
				if(!FMPAs.contains(f)){
					FMPAs.add(f);
				}
			}
		}
		Iterator<FMPA> it=FMPAs.iterator();
		FMPA fmpa;
		//parcours de la liste des fmpa
		while(it.hasNext()){
			fmpa = (FMPA) it.next();
			//si la case "valider" était cochée, passage de l'état à "Terminee"
			if(params.get("validation_"+fmpa.id)!=null&&params.get("validation_"+fmpa.id).equals("valider")){
				fmpa.etat=EtatFMPA.find("id_etatfmpa like ?", "TERMI").first();
				fmpa.save();
			}
			//si la case "annuler" était cochée, passage de l'état à "Invalide"
			else if(params.get("validation_"+fmpa.id)!=null&&params.get("validation_"+fmpa.id).equals("annuler")){
				fmpa.etat=EtatFMPA.find("id_etatfmpa like ?", "INVAL").first();
				fmpa.save();
			}
		}
		/*
		 * Compte le nombre de validations en attente pour les fmpa et l'ajoute à une variable de session et de rendu.
		 */
		if(session.get("gestionnaireFonct").equals("true")||session.get("admin").equals("true")){
			long nbValidAdmin=FMPA.count("etat.id_etatfmpa like ?", "ATVAL");
			session.put("nb_valid_fmpa", nbValidAdmin);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}else if(session.get("gestionnaireTerri").equals("true")){
			long nbValidTerri=FMPA.count("etat.id_etatfmpa like ? and cis.groupement.nom like ?", "ATVAL", session.get("agent_grpt"));
			session.put("nb_valid_fmpa", nbValidTerri);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}else if(session.get("agent_responsable").equals("true")||session.get("chef_CIS").equals("true")){
			long nbValidCis=FMPA.count("etat.id_etatfmpa like ? and cis.nom like ?", "ATVAL", session.get("CISService"));
			session.put("nb_valid_fmpa", nbValidCis);
			renderArgs.put("nb_valid_fmpa", Integer.parseInt(session.get("nb_valid_fmpa")));
		}
		listValidation();
	}

	/**
	 * Calcul les statistiques du département
	 * @param annee
	 */
	public static void statGlobal(int annee){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//création des variables
		int somme;
		int nbParticipant;
		int nbHeure;
		List<Participation> participants;
		Groupement groupement;
		FMPA f;
		List<FMPA> fmpas;
		Iterator<FMPA> itFmpa;
		List<Thematique> themas=Thematique.find("nom not like ?", "SAP_Quinquennal").fetch();
		Iterator<Thematique> itThema;
		Thematique thema;
		List<Groupement> groupements=Groupement.findAll();
		Iterator<Groupement> itGroupement=groupements.iterator();
		//listes des valeurs calculés pour toutes les thématiques
		List<Integer> sommes;
		List<Integer> sommeParticipants;
		List<Integer> nbHeures;
		//hashtables qyi associent une liste de valeurs à un groupement
		Hashtable<String,List> statsGroupements=new Hashtable<String, List>(); 
		Hashtable<String,List> statsParticipants=new Hashtable<String, List>(); 
		Hashtable<String,List> statsHeures=new Hashtable<String, List>();
		Calendar c=Calendar.getInstance();

		//parcours la liste des groupement pour calculer les statistiques par groupement
		while(itGroupement.hasNext()){
			groupement=itGroupement.next();
			itThema=themas.iterator();
			//initialisation des listes
			sommes=new ArrayList<Integer>();
			sommeParticipants=new ArrayList<Integer>();
			nbHeures=new ArrayList<Integer>();
			//parcours la liste des thématiques
			while(itThema.hasNext()){
				thema=itThema.next();
				//regroupe les valeurs des fmpa SAP et SAP_Quinquennales
				if(thema.nom.equals("SAP")){
					fmpas=FMPA.find("(thematique.nom like ? or thematique.nom like ?) and cis.groupement like ? and etat.id_etatfmpa like ?", thema.nom, "SAP_Quinquennal", groupement, "TERMI").fetch();
				}else{
					fmpas=FMPA.find("thematique like ? and cis.groupement like ? and etat.id_etatfmpa like ?", thema, groupement, "TERMI").fetch();	
				}
				itFmpa=fmpas.iterator();
				//initialisation des sommes
				somme=0;
				nbParticipant=0;
				nbHeure=0;
				//parcours les fmpas et si l'année correspond rajoute la durée, le nombre de participants
				//et le nombre d'heures totales aux listes correspondantes
				while(itFmpa.hasNext()){
					f=itFmpa.next();
					c.setTime(f.date);
					if(c.get(Calendar.YEAR)==annee){
						somme=somme+f.duree.minutes;
						participants=Participation.find("fmpa like ? and role.id_rolefmpa like ?", f, "FORME").fetch();
						nbParticipant=nbParticipant+participants.size();
						nbHeure=nbHeure+(f.duree.minutes*participants.size());
					}
				}
				//ajoute les valeurs calculées pour la thématique aux listes correspondantes
				sommes.add(somme);
				sommeParticipants.add(nbParticipant);
				nbHeures.add(nbHeure);
			}
			//lie les listes de valeurs au nom du groupement correspondant
			statsGroupements.put(groupement.nom, sommes);
			statsParticipants.put(groupement.nom, sommeParticipants);
			statsHeures.put(groupement.nom, nbHeures);
		}
		render(statsGroupements, statsParticipants, statsHeures, groupements, themas);
	}

	/**
	 * récupère les informations pour la page des statistiques
	 * appelle le fichier html éponyme
	 */
	public static void statForm(){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		//récupération de la liste des groupements disponibles en fonction de la fonction
		List<Groupement> gpts;
		if(session.get("gestionnaireFonct").equals("true") || session.get("admin").equals("true")){
			gpts=Groupement.find("order by nom").fetch();
		}
		else{
			gpts=new ArrayList<Groupement>();
			Groupement g;
			if(session.get("gestionnaireTerri").equals("true")){
				//récupération des groupements dont l'agent est responsable
				List<Groupement> listG=Groupement.find("responsable.id like ?", Long.decode(session.get("agent_id"))).fetch();
				Iterator<Groupement> itG=listG.iterator();
				while(itG.hasNext()){
					g=itG.next();
					if(!gpts.contains(g)){
						gpts.add(g);
					}
				}
			}
			if(session.get("agent_responsable").equals("true")){
				//récupère les groupements des cis dont l'agent est responsable
				List<CIS> listCis=CIS.find("responsable.id like ?", Long.decode(session.get("agent_id"))).fetch();
				Iterator<CIS> itCis=listCis.iterator();
				CIS c;
				while(itCis.hasNext()){
					c=itCis.next();
					if(!gpts.contains(c.groupement)){
						gpts.add(c.groupement);
					}
				}
			}
			//récupère le groupement de l'agent et l'ajoute s'il est manquant
			g=Groupement.find("nom like ?", session.get("agent_grpt")).first();
			if(!gpts.contains(g)){
				gpts.add(g);
			}
		}
		//crée la liste des années composée de l'année courante, des deux années passées et de l'année suivante
		List<Integer> annees=new ArrayList<Integer>();
		Calendar c=Calendar.getInstance();
		int x=c.get(Calendar.YEAR);
		annees.add(x+1);
		annees.add(x);
		annees.add(x-1);
		annees.add(x-2);
		render(gpts, annees, x);
	}

	/**
	 * calcule les statistiques liés au groupement
	 * @param gpt : id deu groupement sélectionné
	 * @param annee
	 */
	public static void statGpt(long gpt, int annee){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		/*//récupération de la liste des cis du groupement
		Groupement gptSelect=Groupement.findById(gpt);
		List<CIS> listCis=CIS.find("groupement like ?", gptSelect).fetch();
		//creation des variables
		CIS cis;
		List<FMPA> fmpas;
		Iterator<FMPA> itFmpa;
		FMPA fmpa;
		List<Thematique> themas=Thematique.find("nom not like ?", "SAP_Quinquennal").fetch();
		Iterator<Thematique> itThema;
		Thematique thema;
		List<StatistiqueCis> stats=new ArrayList<StatistiqueCis>();
		StatistiqueCis stat;
		List<Participation> participants;
		List<StatistiqueCis> statsParticipants=new ArrayList<StatistiqueCis>();
		StatistiqueCis statParticipant;
		int somme;
		int sommeTotale=0;
		int nbParticipant;
		//parcours la liste des cis pour calculer les statistiques par cis
		Iterator<CIS> itCis=listCis.iterator();
		while(itCis.hasNext()){
			cis=itCis.next();
			itThema=themas.iterator();
			stat=new StatistiqueCis(cis);
			statParticipant=new StatistiqueCis(cis);
			while(itThema.hasNext()){
				thema=itThema.next();
				somme=0;
				nbParticipant=0;
				if(thema.nom.equals("SAP")){
					fmpas=FMPA.find("(thematique.nom like ? or thematique.nom like ?) and cis like ? and etat.nom like ?", thema.nom, "SAP_Quinquennal", cis, "Terminee").fetch();
				}else{
					fmpas=FMPA.find("thematique like ? and cis like ? and etat.nom like ?", thema, cis, "Terminee").fetch();	
				}
				itFmpa=fmpas.iterator();
				while(itFmpa.hasNext()){
					fmpa=itFmpa.next();
					somme=somme+fmpa.duree.minutes;
					participants=Participation.find("fmpa like ? and role.nom like ?", fmpa, "formé").fetch();
					nbParticipant=nbParticipant+participants.size();
				}
				stat.add(somme);
				statParticipant.add(nbParticipant);
				sommeTotale=sommeTotale+somme;
			}
			stats.add(stat);
			statsParticipants.add(statParticipant);
		}
		render(stats,statsParticipants,sommeTotale,gptSelect,themas);*/

		//récupération de la liste des cis du groupement
		Groupement gptSelect=Groupement.findById(gpt);
		List<CIS> listCis=CIS.find("groupement like ?", gptSelect).fetch();
		//creation des variables
		CIS cis;
		List<FMPA> fmpas;
		Iterator<FMPA> itFmpa;
		FMPA fmpa;
		List<Thematique> themas=Thematique.find("nom not like ?", "SAP_Quinquennal").fetch();
		Iterator<Thematique> itThema;
		Thematique thema;
		List<StatistiqueCis> stats=new ArrayList<StatistiqueCis>();
		StatistiqueCis stat;
		List<Participation> participants;
		int somme;
		int nbParticipant;
		int x;
		Calendar c=Calendar.getInstance();

		//parcours la liste des cis pour calculer les statistiques par cis
		Iterator<CIS> itCis=listCis.iterator();
		while(itCis.hasNext()){
			cis=itCis.next();
			itThema=themas.iterator();
			//parcours de la liste des thématiques
			while(itThema.hasNext()){
				thema=itThema.next();
				somme=0;
				nbParticipant=0;
				x=0;
				//regroupe les valeurs des fmpa SAP et SAP_Quinquennales
				if(thema.nom.equals("SAP")){
					fmpas=FMPA.find("(thematique.nom like ? or thematique.nom like ?) and cis like ? and etat.id_etatfmpa like ?", thema.nom, "SAP_Quinquennal", cis, "TERMI").fetch();
				}else{
					fmpas=FMPA.find("thematique like ? and cis like ? and etat.id_etatfmpa like ?", thema, cis, "TERMI").fetch();	
				}
				itFmpa=fmpas.iterator();
				//parcours les fmpas et fait la somme des durées et du nombe de participants
				while(itFmpa.hasNext()){
					fmpa=itFmpa.next();
					c.setTime(fmpa.date);
					//si l'année correspond, ajoute les valeurs à la somme
					if(c.get(Calendar.YEAR)==annee){
						somme=somme+fmpa.duree.minutes;
						participants=Participation.find("fmpa like ? and role.id_rolefmpa like ?", fmpa, "FORME").fetch();
						nbParticipant=nbParticipant+participants.size();
						x=x+fmpa.duree.minutes*participants.size();
					}
				}
				//si la somme n'est pas nulle, ajoute les valeurs de la thématique aux statiqtiques du cis
				if(somme!=0){
					stat=new StatistiqueCis(cis);
					stat.add("thematique", thema.nom);
					stat.add("totalH",somme/60+" h "+somme%60+" min");
					stat.add("totalP",""+nbParticipant);
					stat.add("totalHxF",x/60+" h "+x%60+" min");
					stats.add(stat);
				}
			}
		}
		render(stats,gptSelect,themas);
	}

	/**
	 * calcule les statistiques liés au cis
	 * @param cis : id du cis sélectionné
	 * @param annee
	 */
	public static void statCis(long cis, int annee){
		//vérification des droits d'accès
		if(session.get("agent_responsable").equals("false")&&session.get("chef_CIS").equals("false")&&session.get("gestionnaireTerri").equals("false")&&session.get("gestionnaireFonct").equals("false")&&session.get("formateur").equals("false")&&session.get("admin").equals("false")){
			render("@accessDenied");
		}
		/*//récupération de la liste des agents du cis
		CIS cisObj=CIS.findById(cis);
		List<Agent> listAgent=Agent.find("cis like ?", cisObj).fetch();
		//creation des variables
		Agent a;
		List<Thematique> themas=Thematique.find("nom not like ?", "SAP_Quinquennal").fetch();
		Iterator<Thematique> itThema;
		Thematique thema;
		List<StatistiqueAgent> stats=new ArrayList<StatistiqueAgent>();
		StatistiqueAgent stat;
		List<StatistiqueAgent> statsForm=new ArrayList<StatistiqueAgent>();
		StatistiqueAgent statForm;
		List<Participation> participants;
		Iterator<Participation> itPart;
		Participation participation;
		int somme;
		//parcours la liste des cis pour calculer les statistiques par cis
		Iterator<Agent> itAgent=listAgent.iterator();
		while(itAgent.hasNext()){
			a=itAgent.next();
			itThema=themas.iterator();
			stat=new StatistiqueAgent(a);
			statForm=new StatistiqueAgent(a);
			while(itThema.hasNext()){
				thema=itThema.next();
				somme=0;
				participants=Participation.find("fmpa.thematique like ? and agent like ? and role.nom like ? and fmpa.etat.nom like ?", thema, a, "formé", "Terminee").fetch();
				itPart=participants.iterator();
				while(itPart.hasNext()){
					participation=itPart.next();
					somme=somme+participation.fmpa.duree.minutes;
				}
				stat.add(thema.nom,somme/60+" h "+somme%60+" min");
				somme=0;
				participants=Participation.find("fmpa.thematique like ? and agent like ? and role.nom like ? and fmpa.etat.nom like ?", thema, a, "formateur", "Terminee").fetch();
				itPart=participants.iterator();
				while(itPart.hasNext()){
					participation=itPart.next();
					somme=somme+participation.fmpa.duree.minutes;
				}
				statForm.add(thema.nom,somme/60+" h "+somme%60+" min");
			}
			stats.add(stat);
			statsForm.add(statForm);
		}
		render(stats, statsForm, themas, cisObj);*/

		//récupération de la liste des agents du cis
		CIS cisObj=CIS.findById(cis);
		List<Agent> listAgent=Agent.find("cis like ?", cisObj).fetch();
		//creation des variables
		Agent a;
		Iterator<Agent> itAgent;
		List<Thematique> themas=Thematique.find("nom not like ?", "SAP_Quinquennal").fetch();
		Iterator<Thematique> itThema;
		Thematique thema;
		List<StatistiqueAgent> stats;
		StatistiqueAgent stat;
		List<Participation> participants;
		Iterator<Participation> itPart;
		Participation participation;
		int somme;
		int sommeForm;
		int totalSomme=0;
		int totalForm=0;
		Calendar c=Calendar.getInstance();

		//parcours la liste des thématiques pour calculer les statistiques
		itThema=themas.iterator();
		stats=new ArrayList<StatistiqueAgent>();
		while(itThema.hasNext()){
			thema=itThema.next();
			itAgent=listAgent.iterator();
			//parcours la liste des agents du cis
			while(itAgent.hasNext()){
				a=itAgent.next();
				stat=new StatistiqueAgent(a);
				stat.add("thematique", thema.nom);
				somme=0;
				//regroupe les valeurs des fmpa SAP et SAP_Quinquennales
				if(thema.nom.equals("SAP")){
					participants=Participation.find("(fmpa.thematique.nom like ? or fmpa.thematique.nom like ?) and agent like ? and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", thema.nom, "SAP_Quinquennal", a, "FORME", "TERMI").fetch();
				}else{
					participants=Participation.find("fmpa.thematique like ? and agent like ? and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", thema, a, "FORME", "TERMI").fetch();
				}
				itPart=participants.iterator();
				//parcours les participations pour calculer la durée total passée en tant que formé
				while(itPart.hasNext()){
					participation=itPart.next();
					c.setTime(participation.fmpa.date);
					if(c.get(Calendar.YEAR)==annee){
						somme=somme+participation.fmpa.duree.minutes;
					}
				}
				stat.add("forme",somme/60+" h "+somme%60+" min");
				sommeForm=0;
				//regroupe les valeurs des fmpa SAP et SAP_Quinquennales
				if(thema.nom.equals("SAP")){
					participants=Participation.find("(fmpa.thematique.nom like ? or fmpa.thematique.nom like ?) and agent like ? and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", thema.nom, "SAP_Quinquennal", a, "FORMA", "TERMI").fetch();
				}else{
					participants=Participation.find("fmpa.thematique like ? and agent like ? and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", thema, a, "FORMA", "TERMI").fetch();
				}
				itPart=participants.iterator();
				//parcours les participations pour calculer la durée total passée en tant que formateur
				while(itPart.hasNext()){
					participation=itPart.next();
					c.setTime(participation.fmpa.date);
					if(c.get(Calendar.YEAR)==annee){
						sommeForm=sommeForm+participation.fmpa.duree.minutes;
					}
				}
				stat.add("formateur",sommeForm/60+" h "+sommeForm%60+" min");
				stats.add(stat);
				totalSomme=totalSomme+somme;
				totalForm=totalForm+sommeForm;
			}
		}
		String sForm=totalForm/60+" h "+totalForm%60+" min";
		String s=totalSomme/60+" h "+totalSomme%60+" min";
		render(stats, cisObj, sForm, s, annee);
	}

	/**
	 * calcule les statistiques liés à l'agent
	 * appelle le fichier html éponyme qui génère une page au format imprimable
	 * @param id : id de l'agent
	 * @param annee
	 */
	public static void imprimableAgent(long id, int annee){
		//creation des variables
		Agent a=Agent.findById(id);
		List<Thematique> themas=Thematique.find("nom not like ?", "SAP_Quinquennal").fetch();
		Iterator<Thematique> itThema;
		Thematique thema;
		StatistiqueAgent stat;
		List<Participation> participations;
		Iterator<Participation> itPart;
		Participation participation;
		int somme;
		int total=0;
		int totalForm=0;
		Calendar c=Calendar.getInstance();

		//parcours la liste des thématiques pour calculer les statistiques
		itThema=themas.iterator();
		stat=new StatistiqueAgent(a);
		while(itThema.hasNext()){
			thema=itThema.next();
			somme=0;
			//regroupe les valeurs des fmpa SAP et SAP_Quinquennal
			if(thema.nom.equals("SAP")){
				participations=Participation.find("agent like ? and (fmpa.thematique like ? or fmpa.thematique.nom like ?) and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", a, thema, "SAP_Quinquennal", "FORME", "TERMI").fetch();
			}else{
				participations=Participation.find("agent like ? and fmpa.thematique like ? and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", a, thema, "FORME", "TERMI").fetch();
			}
			//parcours les participations et fait la somme des durées
			itPart=participations.iterator();
			while(itPart.hasNext()){
				participation=itPart.next();
				c.setTime(participation.fmpa.date);
				if(c.get(Calendar.YEAR)==annee){
					somme=somme+participation.fmpa.duree.minutes;
				}
			}
			total=total+somme;
			stat.add(thema.nom+"forme", somme/60+" h "+somme%60+" min");

			somme=0;
			//regroupe les valeurs des fmpa SAP et SAP_Quinquennal
			if(thema.nom.equals("SAP")){
				participations=Participation.find("agent like ? and (fmpa.thematique like ? or fmpa.thematique.nom like ?) and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", a, thema, "SAP_Quinquennal", "FORMA", "TERMI").fetch();
			}else{
				participations=Participation.find("agent like ? and fmpa.thematique like ? and role.id_rolefmpa like ? and fmpa.etat.id_etatfmpa like ?", a, thema, "FORMA", "TERMI").fetch();
			}
			//parcours les participations et fait la somme des durées
			itPart=participations.iterator();
			while(itPart.hasNext()){
				participation=itPart.next();
				c.setTime(participation.fmpa.date);
				if(c.get(Calendar.YEAR)==annee){
					somme=somme+participation.fmpa.duree.minutes;
				}
			}
			totalForm=totalForm+somme;
			stat.add(thema.nom+"formateur", somme/60+" h "+somme%60+" min");
		}
		render(stat, total, themas, annee);
	}
}
